home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / fast278j.lzh / FIPX.F < prev    next >
Text File  |  1992-10-19  |  6KB  |  258 lines

  1.  
  2. ;===========================================================================
  3. ; FAST IPX Communications Handler
  4. ;===========================================================================
  5.  
  6. const ipx_socket=4246h        ;FB
  7. const test_length=15
  8.  
  9. ;== functions ==============================================================
  10.  
  11. function ipx_init
  12.     {
  13.     reg ax=7a00h
  14.     int 2fh
  15.     ax=reg ax
  16.     poke enteripx,reg di
  17.     poke enteripx+2,reg es
  18.     return low ax
  19.     }
  20.  
  21. function ipx(func)
  22.     {
  23.     reg bx=func
  24.     reg dx=ipx_socket
  25.     inline 9ah            ;callf enteripx routine
  26.     enteripx: data 0,0
  27.     ax=reg ax
  28.     socket=reg dx
  29.     return low ax
  30.     }
  31.  
  32. proc setup_ecb_header(length)
  33.     {
  34.     poke ecb_fragments,1
  35.     poke ecb_frag_addr,ipx_packet
  36.     poke ecb_frag_addr+2,reg ds
  37.     poke ecb_frag_size,length
  38.     }
  39.  
  40. function poll_in_use
  41.     {
  42.     counter=0
  43.     while peekb ecb_in_use
  44.     {
  45.     ipx(0ah)            ;relinquish control
  46.     if key=27 then beep:goto exit_fipx
  47.     counter++
  48.     }
  49. ;   print bios counter;" polls"
  50.     return peekb ecb_completion
  51.     }
  52.  
  53. function ipx_send(ipx_node,length)
  54.     {
  55.     length+=30
  56.     moveb 6 from ipx_node to ipx_dest_node
  57.     reg es=reg ds
  58.     reg si=ipx_dest_network
  59.     reg di=ecb_immediate
  60.     if ipx(2) then return 0        ;get targets address
  61.  
  62.     setup_ecb_header
  63.  
  64.     ;setup ipx packet(s)
  65.     poke ipx_length,length
  66.  
  67.     ;send packet...
  68.     reg es=reg ds
  69.     reg si=ecb_header
  70.     ipx(3)                ;send packet
  71.  
  72.     c=poll_in_use
  73.     return c
  74.     }
  75.  
  76. function ipx_receive
  77.     {
  78.     setup_ecb_header(576)    ;maximum length
  79.  
  80.     ;start listening...
  81.     print bios "listening ... ";
  82.     reg es=reg ds
  83.     reg si=ecb_header
  84.     if ipx(4) then
  85.     {
  86.     print bios " socket does not exist."
  87.     return 0
  88.     }
  89.  
  90.     c=poll_in_use
  91.  
  92.     if c=0 then
  93.     {
  94.     rl=peek ipx_length-30
  95.     rm=ipx_data
  96.     print bios "'";
  97.     while rl print bios chr peekb rm;:rm++:rl--
  98.     print bios "'"
  99.     }
  100.  
  101.     return c
  102.     }
  103.  
  104. ;== start ==================================================================
  105.  
  106. print bios "FAST IPX Communicator"
  107.  
  108. if ipx_init <> 0ffh then
  109.     {
  110.     print bios "Error initialising IPX (not loaded?)."
  111.     stop
  112.     }
  113.  
  114. if ipx(0)=0feh then        ;open socket?
  115.     {
  116.     printh bios "Error opening socket - no more sockets available."
  117.     stop
  118.     }
  119.  
  120. print bios "IPX initialised and socket open Ok"
  121.  
  122. server=0
  123. s=81h
  124. while peekb s<>13
  125.     {
  126.     if (lcase peekb s)='s' then server=1
  127.     s++
  128.     }
  129.  
  130. if server=0 then
  131.     {
  132.     moveb test_length from test_data to ipx_data    ;hello?
  133.     if ipx_send(node_broadcast,test_length) then
  134.     {
  135.     print bios "Error sending packet."
  136.     goto exit_fipx
  137.     }
  138.  
  139.     if ipx_receive=0 then
  140.     {
  141.     print bios "FIPX server is NOT listening."
  142.     goto exit_fipx
  143.     }
  144.     }
  145.  
  146. chat:
  147.  
  148. if not server then
  149.     {
  150.     print bios
  151.     print bios "Lets have a chat?"
  152.     print bios "<msg> ";
  153.     inputs talk
  154.     print bios
  155.  
  156.     length=peekb (talk+1)
  157.     if length=0 then print bios "User aborted.":goto exit_fipx
  158.     moveb length from talk+2 to ipx_data
  159.  
  160.     if ipx_send(ipx_source_node,length) then
  161.     {
  162.     print bios "Error sending packet."
  163.     goto exit_fipx
  164.     }
  165.     }
  166.  
  167. if not ipx_receive then
  168.     {
  169.     print bios "Listening: nobody there."
  170.     goto exit_fipx
  171.     }
  172.  
  173. if server then
  174.     {
  175.     moveb 2 from ipx_ok to ipx_data
  176.     if ipx_send(node_broadcast,2) then        ;use source node if not server
  177.     {
  178.     print bios "Error sending packet."
  179.     goto exit_fipx
  180.     }
  181.     }
  182.  
  183. goto chat
  184.  
  185. exit_fipx:
  186. ipx(1)                ;close socket
  187. stop
  188.  
  189. ;== data ===================================================================
  190.  
  191. test_data: datab 'Hello FastBase?'
  192.  
  193. ipx_ok: datab 'Ok'
  194.  
  195. node_broadcast: datab 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
  196.  
  197. talk: string 70
  198.  
  199. ipx_packet:
  200.  
  201. ipx_checksum:        data    0ffffh
  202. ipx_length:        data    0        ;set this
  203. ipx_transport:        datab    0
  204. ipx_type:        datab    0
  205. ipx_dest_network:    datab    0,0,0,0
  206. ipx_dest_node:        datab    0,0,0,0,0,0    ;set this
  207. ipx_dest_socket:    data    ipx_socket
  208. ipx_source_network:    datab    0,0,0,0
  209. ipx_source_node:    datab    0,0,0,0,0,0
  210. ipx_source_socket:    data    0000h
  211.  
  212. ipx_data:        space 546    ;maximum data size per packet
  213.  
  214. ;notes:
  215. ;if the node = 0ffffffffffffh this is broadcast to all
  216.  
  217.  
  218. ecb_header:            ;ecb
  219.  
  220. ecb_link:        data    0,0
  221. ecb_address:        data    0,0
  222. ecb_in_use:        datab   0
  223. ecb_completion:     datab   0
  224. ecb_socket:        data    ipx_socket
  225. ecb_workspace:        data    0,0
  226. ecb_driver:        datab   0,0,0,0,0,0,0,0,0,0,0,0
  227. ecb_immediate:        datab   0,0,0,0,0,0
  228. ecb_fragments:        data    0        ;lo-hi !!!
  229. ecb_frag_addr:        data    0,0
  230. ecb_frag_size:        data    0
  231.             space   9*6     ;room for 10 fragments
  232.  
  233. ;notes:
  234. ;send must set esr address, socket, immediate address and 1 fragment
  235. ;receive must set esr address, socket and 1 fragment
  236.  
  237. ;in use flag:
  238. ; 00 = done
  239. ; FB = send or receive has occurred but ecb is in a holding queue waiting
  240. ; FD = an event is scheduled and IPX awaits expiration
  241. ; FE = IPX is listening for incoming packets
  242. ; FF = ECB is in use sending a packet
  243. ; FA = ECB is being processed
  244. ; F8 = send was attempted while IPX was busy, queued for later processing
  245.  
  246. ;completion code on send:
  247. ; 00 = sent ok
  248. ; FC = send cancelled
  249. ; FD = packet is malformed (ie: ecb or ipx packet has invalid values)
  250. ; FE = undelivered - there was no listener
  251. ; FF = hardware/network failure - can't send packet
  252.  
  253. ;completion code on receive:
  254. ; 00 = packet has been received
  255. ; FC = listen request has been cancelled
  256. ; FD = overflow - packet received but fragment count = 0 or not enough space
  257. ; FF = the socket is closed
  258.